//package eee.xiang.cloud_learning.common.zookeeper;
//
//import org.apache.curator.framework.CuratorFramework;
//import org.apache.curator.framework.recipes.cache.ChildData;
//import org.apache.zookeeper.CreateMode;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//
///**
// * @author x-yin
// * @Date 2019/8/27
// */
//@Component
//public class ZKClientUtil {
//
//    @Autowired
//    private CuratorFramework zkClient;
//
//    /**
//     * <td>
//     *      如果没有设置节点属性，节点创建模式默认为持久化节点，内容默认为空
//     *      创建一个节点，附带初始化内容
//     *      client.create().forPath("path","init".getBytes());
//     *      创建一个节点，指定创建模式（临时节点），内容为空
//     *      client.create().withMode(CreateMode.EPHEMERAL).forPath("path");
//     *      创建一个节点，指定创建模式（临时节点），附带初始化内容，并且自动递归创建父节点
//     *      client.create()
//     *       .creatingParentContainersIfNeeded()
//     *       .withMode(CreateMode.EPHEMERAL)
//     *       .forPath("path","init".getBytes());
//     *      <span>
//     *          这个creatingParentContainersIfNeeded()接口非常有用，
//     *          因为一般情况开发人员在创建一个子节点必须判断它的父节点是否存在，
//     *          如果不存在直接创建会抛出NoNodeException，使用creatingParentContainersIfNeeded()之后
//     *          Curator能够自动递归创建所有所需的父节点。
//     *      </span>
//     *
//     *
//     * </td>
//     */
//    /**
//     * 创建节点
//     * @param mode  节点类型
//     *              <li>
//     *                  PERSISTENT              持久化目录节点，存储的数据不会丢失。
//     *                  PERSISTENT_SEQUENTIAL   顺序自动编号的持久化目录节点，存储的数据不会丢失
//     *                  EPHEMERAL               临时目录节点，一旦创建这个节点的客户端与服务器端口也就是session 超时，这种节点会被自动删除
//     *                  EPHEMERAL_SEQUENTIAL    临时自动编号节点，一旦创建这个节点的客户端与服务器端口也就是session 超时
//     *                                          这种节点会被自动删除，并且根据当前已近存在的节点数自动加 1，然后返回给客户端已经成功创建的目录节点名。
//     *              </li>
//     * @param path
//     * @param nodeData
//     */
//    public void createNode(CreateMode mode, String path, String nodeData){
//        try {
//            zkClient.create().creatingParentsIfNeeded().withMode(mode).forPath(path, nodeData.getBytes("utf-8"));
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 删除节点
//     * @param path
//     * @param deleteChildre    是否删除子节点
//     */
//    public void deleteNode(final String path,Boolean deleteChildre){
//        try {
//            if(deleteChildre){
//                //guaranteed()删除一个节点，强制保证删除,
//                // 只要客户端会话有效，那么Curator会在后台持续进行删除操作，直到删除节点成功
//                zkClient.delete().guaranteed().deletingChildrenIfNeeded().forPath(path);
//            }else{
//                zkClient.delete().guaranteed().forPath(path);
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 设置指定节点的数据
//     * @param path
//     * @param datas
//     */
//    public void setNodeData(String path, byte[] datas){
//        try {
//            zkClient.setData().forPath(path, datas);
//        }catch (Exception ex) {
//            ex.printStackTrace();
//        }
//    }
//
//    /**
//     * 获取数据时先同步
//     * @param path
//     * @return
//     */
//    public byte[] synNodeData(String path){
//        zkClient.sync();
//        return getNodeData(path);
//    }
//
//    /**
//     * 获取指定节点的数据
//     * @param path
//     * @return
//     */
//    public byte[] getNodeData(String path){
//        Byte[] bytes = null;
//        try {
//            if(ZKConfig.treeCache != null){
//                ChildData data = ZKConfig.treeCache.getCurrentData(path);
//                if(data != null){
//                    return data.getData();
//                }
//            }
//            return zkClient.getData().forPath(path);
//        }catch (Exception ex) {
//            ex.printStackTrace();
//        }
//        return null;
//    }
//
//    /**
//     * 获取节点的子节点
//     * @param path
//     * @return
//     */
//    public List<String> getChildren(String path) {
//        List<String> childrenList = new ArrayList<>();
//        try {
//            childrenList = zkClient.getChildren().forPath(path);
//        } catch (Exception ex) {
//            ex.printStackTrace();
//        }
//        return childrenList;
//    }
//
//    /**
//     * 判断路径是否存在
//     *
//     * @param path
//     * @return
//     */
//    public boolean isExistNode(final String path) {
//        zkClient.sync();
//        try {
//            return null != zkClient.checkExists().forPath(path);
//        } catch (Exception ex) {
//            return false;
//        }
//    }
//
//}
